import runtimeType from '../runtimeType';
import request from '../../network/request';

/**
 * 【异步方法】获取系统设备信息
 * @param callback 成功回调函数
 * @param isGetIp 是否获取设备IP地址，默认：false
 */
function systemInfo(callback, isGetIp = false) {
    
    // 初始化返回数据，数值单位：px
    let data_back = {
        "IP": '', // 设备IP地址
        "country": "", // 国家
        "province": "", // 省份
        platform: '', // 客户端平台，值域为：ios、android、pc
        system: '', // 操作系统版本(即安卓版本)
        brand: '', // 手机品牌
        model: '', // 手机型号
        "statusBar": 0, // 设备顶部状态栏高度(px)
        "navigationBar": 0, // 页面标题栏高度(px)
        "width": 0, // page窗口宽度(px)
        "height": 0, // page窗口高度(px)
        "screenWidth": 0, // 设备屏幕总宽度(px)
        "screenHeight": 0, // 设备屏幕总高度(px)
    };
    
    // 是否全部信息获取完成
    let finish_system = false; // 系统信息获取完毕
    let finish_IP = isGetIp == true ? false : true; // IP地址获取完毕
    // 获取完毕后的回调方法
    let fun_back = () => {
        // 如果信息都获取完毕，执行回调
        if (finish_system ==  true && finish_IP == true) {
            // 执行回调
            if (callback) { callback(data_back); }
        }
    };
    
    // 获取当前运行环境
    let runType = runtimeType();
    // 如果是“非UNI”环境
    if (runType == 'NOT-UNI')
    {
        // 获取内核信息
        let ua = navigator.userAgent.toLowerCase();
        // 设备平台类型
        if (ua.indexOf('android') >= 0 || ua.indexOf('linux') >= 0) { data_back.platform = 'android'; }
        else if (ua.match(/\(i[^;]+;( u;)? cpu.+mac os x/)) { data_back.platform = 'ios'; }
        else { data_back.platform = 'pc' }
        // 设备平台版本
        try {
            if (data_back.platform == 'android') { data_back.system = ua.match(/android ([\d.]+)/)[1]; }
            else if (data_back.platform == 'ios') { data_back.system = ua.match(/version\/([\d.]+)/)[1]; }
            else if (data_back.platform == 'pc') { data_back.system = navigator.platform; }
        } catch (e) {}
        // 浏览器名称
        if (ua.indexOf('micromessenger') >= 0) { data_back.brand = 'WeChat'; }
        else if (ua.indexOf("opr") >= 0 || ua.indexOf("opera") >= 0) { data_back.brand = 'Opera'; }
        else if (ua.indexOf("firefox") >= 0) { data_back.brand = 'FireFox'; }
        else if (ua.indexOf("chrome") >= 0) { data_back.brand = 'Chrome'; }
        else if (ua.indexOf("safari") >= 0) { data_back.brand = 'Safari'; }
        else if (ua.indexOf("msie") >= 0 || ua.indexOf("rv") >= 0) { data_back.brand = 'IE'; }
        // 浏览器版本号
        try{
            if (data_back.brand=='WeChat') { data_back.model = ua.match(/micromessenger\/([\d.]+)/i)[1]; }
            else if (data_back.brand=='Opera') { data_back.model = ua.match(/opera.([\d.]+)/)[1]; }
            else if (data_back.brand=='FireFox') { data_back.model = ua.match(/firefox\/([\d.]+)/)[1]; }
            else if (data_back.brand=='Chrome') { data_back.model = ua.match(/chrome\/([\d.]+)/)[1]; }
            else if (data_back.brand=='Safari') { data_back.model = ua.match(/safari\/([\d.]+)/)[1]; }
            else if (data_back.brand=='IE') { data_back.model = ua.match(/msie ([\d.]+)/)[1]; }
        } catch (e) {}
        // 页面窗口大小 赋值
        data_back.width = Math.round(window.innerWidth);
        data_back.height = Math.round(window.innerHeight);
        // 屏幕大小 赋值
        data_back.screenWidth = Math.round(window.screen.width);
        data_back.screenHeight = Math.round(window.screen.height);
        // 系统信息获取完毕标识
        finish_system = true;
        // 执行回调方法
        fun_back();
    }
    // 如果是UNI环境
    else {
        // 获取系统信息
        uni.getSystemInfo({
            success: (sysInfo) => {
                // 手机设备信息 赋值
                data_back.platform = sysInfo.osName;
                data_back.system = sysInfo.osVersion;
                data_back.brand = sysInfo.deviceBrand;
                data_back.model = sysInfo.deviceModel;
                // 状态栏信息 赋值
                data_back.statusBar = sysInfo.statusBarHeight;
                // 原生导航栏信息 赋值
                data_back.navigationBar = 44;
                // 页面窗口大小 赋值
                data_back.width = Math.round(sysInfo.windowWidth);
                data_back.height = Math.round(sysInfo.windowHeight);
                // 屏幕大小 赋值
                data_back.screenWidth = Math.round(sysInfo.screenWidth);
                data_back.screenHeight = Math.round(sysInfo.screenHeight);
                // 系统信息获取完毕标识
                finish_system = true;
                // 执行回调方法
                fun_back();
            }
        });
    }
    
    // 获取IP地址信息
    if (isGetIp == true)
    {
        // 发起请求
        request({
            method: 'GET',
            url: 'http://app.bilibili.com/x/resource/ip',
            loadingText: null,
            openHttphead: false,
            openGreen: true,
            openError: false,
            timeout: 2000,
            // 请求失败
            fail: () => {
                // IP地址信息获取完毕标识
                finish_IP = true;
                // 执行回调方法
                fun_back();
            },
            // 请求成功
            success: (res) => {
                // 取出云端返回的数据
                let data_cloud = res.data;
                // 有效数据执行
                if (data_cloud && data_cloud.addr)
                {
                    // IP地址信息 赋值
                    data_back.IP = data_cloud.addr;
                    data_back.country = data_cloud.country;
                    data_back.province = data_cloud.province;
                }
                // IP地址信息获取完毕标识
                finish_IP = true;
                // 执行回调方法
                fun_back(); 
            }
        });
    }
    
}

export default systemInfo;